﻿/*==============================================================================
模块名      :  CComboxEx
文件名      :  combox_ex.h
相关文件    :  combox_ex.cpp
文件实现功能:   ComboxBox扩展，解决弹出项显示位置错乱的问题
作者        :
版本    ：
==============================================================================*/

#include "combox_ex.h"
#include <qcoreevent.h>
#include <QPainter>
#include <QStylePainter>

CComboxEx::CComboxEx(QWidget *parent) :
    QComboBox(parent)
{

}
CComboxEx::~CComboxEx()
{

}

// 拦截ComboBox鼠标消息解决父窗口显示位置移动问题
void CComboxEx::mousePressEvent(QMouseEvent* event)
{
	//QComboBox::mousePressEvent(event);
}
void CComboxEx::mouseReleaseEvent(QMouseEvent* event)
{
	QComboBox::mousePressEvent(event);
}
void CComboxEx::mouseDoubleClickEvent(QMouseEvent* event)
{
	//  QComboBox::mousePressEvent(event);
}
void CComboxEx::mouseMoveEvent(QMouseEvent* event)
{
	// QComboBox::mouseMoveEvent(event);
}

void CComboxEx::paintEvent(QPaintEvent *e)
{
    if (m_bTextCenter)
    {
		QStylePainter painter(this);
		painter.setPen(palette().color(QPalette::Text));

		// draw the combobox frame, focusrect and selected etc.
		QStyleOptionComboBox opt;
		initStyleOption(&opt);
		painter.drawComplexControl(QStyle::CC_ComboBox, opt);

		if (currentIndex() < 0)
			opt.palette.setBrush(QPalette::ButtonText, opt.palette.brush(QPalette::ButtonText).color().lighter());

		// draw the icon and text
		//painter.drawControl(QStyle::CE_ComboBoxLabel, opt);   //不需要再绘制文本内容
		// 以上代码是Qt默认实现

		painter.end();

		// 在文本区域绘制按钮文本
		QPainter painter2(this);
		QStyleOptionButton buttonOpt;
		buttonOpt.initFrom(this);	// 主要是一些窗口状态，hover、enable等
		QRect editRect = this->style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this);
		buttonOpt.rect = editRect;	// 设置按钮区域为QComboBox的文本区域
		buttonOpt.text = opt.currentText;	// 设置文本
		// 绘制QStyle::CE_PushButtonLabel
		this->style()->drawControl(QStyle::CE_PushButtonLabel, &buttonOpt, &painter2, this);
    }
    else
    {
		QComboBox::paintEvent(e);
    }

}
